package part1.chapter6_practice;

import org.junit.Test;

import static org.junit.Assert.assertEquals;

/**
 * Created by lie on 2018/3/9.
 * @see Game2
 */
public class MonoStateTest2 {
    private Game2 g = new Game2();

    @Test
    public void testOneThrows(){
        g.add(5);
        assertEquals(5, g.getScore());
    }

    @Test
    public void testTowThrowsNoMark(){
        g.add(5);
        g.add(4);
        assertEquals(9, g.getScore());
    }

    @Test
    public void testFourThrowsNoMark(){
        g.add(5);
        g.add(4);
        g.add(7);
        g.add(2);
        assertEquals(18, g.getScore());
        assertEquals(9, g.getScoreByFrame(1));
        assertEquals(18, g.getScoreByFrame(2));
    }

    @Test
    public void simpleSpare(){
        g.add(3);
        g.add(7);
        g.add(3);
        g.add(2);
        //第一局
        assertEquals(13, g.getScoreByFrame(1));
        //第二局
        assertEquals(18, g.getScoreByFrame(2));
        //拿分数——并不能通过，所以是getScore出了问题
        assertEquals(18, g.getScore());
    }

    @Test
    public void testGetCurrentFrame(){
        g.add(3);
        g.add(7);//第一格结束
        assertEquals(2, g.getCurrentFrame());
        g.add(3);
        assertEquals(2, g.getCurrentFrame());
        g.add(2);//第二格结束
        assertEquals(3, g.getCurrentFrame());
    }

    @Test
    public void test(){
        g.add(10);
        g.add(3);
        g.add(6);
        assertEquals(19, g.getScoreByFrame(1));
        assertEquals(28, g.getScore());
        assertEquals(3, g.getCurrentFrame());
    }


    /**
     * 这里产生了对
     * @see Game2#currentFrame 的困扰
     * 从之前的代码来看，这个CurrentFrame会有这样的问题：
     *  1）当第十个格子结束投掷的时候，他会+1，从而变成11
     *  2）假如你不让他它11，则本身在传进{@link Game2#getScoreByFrame(int)}就会发生问题
     *  这事关{@link Game2#currentFrame}起手定义为1.
     *
     * 所以我们应该如何定义所谓的当前轮（currentFrame）呢？
     *
     */
    @Test
    public void testPerfectGame(){
        for (int i = 0; i < 12; i++) {
            //模拟全部10分的情况
            g.add(10);
        }
        assertEquals(300, g.getScore());
        assertEquals(11, g.getCurrentFrame());
    }

    @Test
    public void testEndOfArray(){
        for (int i = 0; i < 9; i++) {
            g.add(0);
            g.add(0);
        }
        g.add(2);
        g.add(8);
        g.add(10);
        assertEquals(20, g.getScore());
    }

    @Test
    public void testSampleGame(){
        //现在可以把样例怼进来看看了
        g.add(	1	);
        g.add(	4	);

        g.add(	4	);
        g.add(	5	);

        g.add(	6	);
        g.add(	4	);

        g.add(	5	);
        g.add(	5	);

        g.add(	10	);

        g.add(	0	);
        g.add(	1	);

        g.add(	7	);
        g.add(	3	);

        g.add(	6	);
        g.add(	4	);

        g.add(	10	);

        g.add(	2	);
        g.add(	8	);
        g.add(	6	);
        assertEquals(133, g.getScore());
    }

    @Test
    public void testHeartBreak(){
        for (int i = 0; i < 11; i++) {
            g.add(10);
        }
        g.add(9);
        assertEquals(299, g.getScore());
    }

    @Test
    public void testTenthFrameSpare(){
        for (int i = 0; i < 9; i++) {
            g.add(10);
        }
        g.add(9);
        g.add(1);
        g.add(1);
        assertEquals(270, g.getScore());
    }

    //至此，目前已通过所有测试用例
    //接下来需要重构一下game2里的东西了，实在很乱
}
